package org.com.creationalPattern.factory;

/**
 * 生产工厂类
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/13 18:27
 */

/**
 *
 * 1.   工厂方法模式的优点工厂方法模式的优点有以下几个方面。
 *      ■ 良好的封装性，代码结构清晰。一个对象创建是有条件约束的，如果一个调用者需要一个具体的产品对象，
 *          只要知道这个产品的类名或约束字符串即可，不用知道创建对象的过程如何，降低了模块间的耦合。
 *      ■ 优秀的可扩展性。在增加产品类的情况下，只要适当地修改具体的工厂类或扩展一个工厂类，就可以适应变化。
 *      ■ 屏蔽产品类。产品类的实现如何变化，调用者都不需要关心，而只需要关心产品的接口，只要接口保持不变，
 *          系统的上层模块就不需要发生变化。因为产品的实例化是由工厂类负责的，具体生产何种产品对象是由不同的工厂类决定的。
 *      ■ 工厂方法模式是典型的解耦框架。高层模块只需要知道产品的抽象类，其他的实现类都不用关心。工厂方法模式符合迪米特法则，
 *      也符合依赖倒置原则，只依赖产品类的抽象；另外还符合里氏替换原则，可以使用产品子类替换产品父类。
 *
 * 2.   工厂方法模式的使用场景
 *      工厂方法模式在项目中使用得非常频繁，在很多框架的代码中都可以发现工厂方法模式的应用。可使用工厂方法模式的典型场景如下
 *      ■ 工厂方法模式是new一个对象的替代品，因此在所有需要生成对象的地方都可以使用，但是需要慎重考虑是否需要增加一个工厂类进行管理，
 *      增加代码的复杂度。
 *      ■ 需要灵活的、可扩展的框架时，可以考虑采用工厂方法模式
 *      ■ 工厂方法模式可以用在异构项目中，例如，通过WebService与一个非Java的项目交互，虽然WebService号称是可以做到异构系统的同构化，
 *      但是在实际开发中，还是会碰到很多问题，如类型问题、WSDL文件的支持问题等。从WSDL中产生的对象都认为是一个产品，
 *      然后由一个具体的工厂类进行管理，减少与外围的耦合。
 *      ■ 工厂方法模式可以使用在测试驱动开发的框架下。例如，测试一个类 A，就需要将与类A关联的类B也同时产生出来，
 *      使用工厂方法模式可以将类B虚拟出来，避免类A与类B的耦合
 *
 */
public class ConcreteCreator implements Creator {
    public <T extends Product> T factory(Class<T> c) {
        Product product = null;

        try {
            product = (Product) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) product;
    }
}
